package com.qqin.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.qqin.exeption.ServiceException;
import com.qqin.mapper.CheckMapper;
import com.qqin.mapper.GoodsMapper;
import com.qqin.pojo.Check;
import com.qqin.pojo.Goods;
import com.qqin.pojo.PageBean;
import com.qqin.service.GoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

@Service
public class GoodsServiceImpl implements GoodsService {
    @Autowired
    private GoodsMapper goodsMapper;
    @Autowired
    private CheckMapper checkMapper;

    @Override
    public PageBean page(Integer page, Integer pageSize) {
        PageHelper.startPage(page, pageSize);

        List<Goods> goods = goodsMapper.selectAll();
        Page<Goods> p = (Page<Goods>) goods;

        return new PageBean(p.getTotal(), p.getResult());
    }

    //根据商品ID查询单个商品信息。
    @Override
    public Goods selectById(Integer goodsId) {

        return goodsMapper.selectById(goodsId);
    }

    //查询所有上架的商品。(查询状态码即可）
    @Override
    public List<Goods> selectByListed() {

        return goodsMapper.selectByListed();
    }

    //根据商品名查询商品（模糊查询）
    @Override
    public List<Goods> selectByCondition(String goodsName) {

        return goodsMapper.selectByCondition(goodsName);
    }

    //随机选取一定数量的上架商品作为轮播图。如果上架商品数量不足，则抛出异常。
    @Override
    public List<Goods> getPhoto(Integer photoNum) {
        List<Goods> goods = goodsMapper.selectByListed();//查询所有待售的商品

        if (goods.size() < 4) {
            throw new ServiceException("物品数量不足，轮播图暂不可用");
        }

        List<Goods> photos = new ArrayList<>();//用于存储轮播图商品

        Random random = new Random();//生成随机数

        for (int i = 0; i < photoNum; i++) {
//            在每次循环中，使用 random 对象的 nextInt 方法生成一个随机整数 r，
//            这个整数的范围是从 0 到 goods.size() - 1（goods.size() 是商品列表的大小）。这个随机数将用作商品列表的索引。
            int r = random.nextInt(goods.size());
//            使用随机生成的索引 r 从商品列表 goods 中获取一个商品，并将其添加到 photos 列表中。
            photos.add(goods.get(r));
//            从商品列表 goods 中移除刚才被选中的商品。这样做是为了保证每个商品只能被选中一次，避免重复选取同一个商品。
            goods.remove(r);
        }

        return photos;
    }

    //添加商品
    @Override
    public void add(Goods goods, Integer userId) {
        LocalDateTime nowTime = LocalDateTime.now();
        goods.setCreateTime(nowTime);
        goods.setUpdateTime(nowTime);
        goods.setState(0);
        goodsMapper.add(goods);

        List<Goods> gs = goodsMapper.selectByAny(goods);//查询刚刚添加的商品

        Goods g = gs.get(0);
//        将商品状态设置为0（未上架）。

        Check check = new Check();
        check.setCheckUser(userId);
        check.setCheckGoods(g.getGoodsId());
        check.setState(0);
        checkMapper.add(check);
    }

    //更新商品信息
    @Override
    public Goods updateById(Goods goods) {
        LocalDateTime nowTime = LocalDateTime.now();
        goods.setUpdateTime(nowTime);
        //查询商品并检查状态
        Goods g = goodsMapper.selectById(goods.getGoodsId());
        if (g.getState() == 2) {
            throw new ServiceException("该商品已售出");
        } else if (g.getState() == 3) {
            throw new ServiceException("该商品已下架");
        }
        //检查商品状态，如果商品已售出或已下架，则抛出异常。
        goodsMapper.updateById(goods);
        return goods;
    }

    //商品下架
    @Override
    public void delisting(Integer goodsId) {
        Goods goods = goodsMapper.selectById(goodsId);

        if (goods.getState() == 0) {
            throw new ServiceException("该商品未上架");
        } else if (goods.getState() == 2) {
            throw new ServiceException("该商品已售出");
        } else if (goods.getState() == 3) {
            throw new ServiceException("该商品已下架");
        }

        goodsMapper.delisting(goodsId);
    }

    //上传图片
    @Override
    public String upload(MultipartFile photo) throws IOException {
        String frName = photo.getOriginalFilename();//获取原始的文件名
        int index = frName.lastIndexOf(".");//获取文件后缀
        String suffixName = frName.substring(index);

        String fsName = System.currentTimeMillis() + suffixName;//生成文件名
        String address = "D:\\zhuanshe111\\second-hand-trading-platform\\fleaMarket\\imagegoods\\" + fsName;
        //设置文件保存路径
        photo.transferTo(new File(address));
        //将文件保存到指定路径

        return "http://localhost:8080/imagegoods/" + fsName;//返回文件访问url
    }

}
